package com.bear.线性结构.稀疏数组;

import java.io.*;

/**
 * <简述>
 * <详细描述>
 *
 * @author LiuShanshan
 * @version $Id$
 */
public class SparsearryTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        System.out.println("二维数组：");
        // 生成二维数组 行 8 ，列7
        int charArray[][] = new int[8][7];
        // 1代表黑棋
        charArray[1][2] = 1;
        // 2代表蓝旗
        // 没有赋值的为0
        charArray[2][3] = 2;
        charArray[4][3] = 3;
        int sum = 0;
        for (int[] hang : charArray) {    // 2维数组变1维数组
            for (int i : hang) {
                if(i != 0){
                    sum ++;
                }
                System.out.printf("%d\t", i);
            }
            System.out.printf("\n");
        }
        System.out.println("=======================");
        System.out.println("稀疏数组:");
        // 生成散列数组  已知只会有3列，现在需要确实有几行
        int sparseArray[][] = new int[sum + 1][3];
        sparseArray[0][0] = 8;
        sparseArray[0][1] = 7;
        sparseArray[0][2] = sum;
        int count = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++){
                if(charArray[i][j] != 0){
                    count ++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = charArray[i][j];
                }
            }
        }
        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                System.out.printf("%d\t", anInt);
            }
            System.out.printf("\n");
        }

        // 稀疏数组反推到二维数组
        System.out.println("=======================");
        System.out.println("散列数组反推到二维数组");
        int thrustArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i = 1; i < sparseArray.length; i++) {
            thrustArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        for (int[] ints : thrustArray) {
            for (int anInt : ints) {
                System.out.printf("%d\t",anInt);
            }
            System.out.printf("\n");
        }
        // 将稀疏数组保存到磁盘上
        // 将数据导入到磁盘中
        stream(thrustArray);

        // 将磁盘上的稀疏数组还原回来
        System.out.println("==================");
        System.out.println("磁盘中还原数据：");
        stream();
    }

    // 保存数据到文件中
    public static void stream(int[][] ob) throws IOException {
        FileOutputStream fos = new FileOutputStream("c:\\javas\\map.data");//字节流
        ObjectOutputStream oos = new ObjectOutputStream(fos);//对象输出流
        oos.writeObject(ob);//存到磁盘上，序列化
//        FileInputStream fis = new FileInputStream("c:\\javas\\map.data");
//        ObjectInputStream ois = new ObjectInputStream(fis);//对象输入流
//        System.out.println(ois.readObject());//读的时候，反序列化

    }

    // 从文件中获取数据
    public static void stream() throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream("c:\\javas\\map.data");
        ObjectInputStream ois = new ObjectInputStream(fis);//对象输入流
        int[][] ints = (int[][]) ois.readObject(); //读的时候，反序列化
        for (int[] anInt : ints) {
            for (int i : anInt) {
                System.out.printf("%d\t" , i);
            }
            System.out.printf("\n");
        }
    }


}
